/**
 * @Author yinyunqi
 * @date 2018年1月3日
 * @Content 
 */
package com.yongqi.service.console;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.abel533.echarts.Option;
import com.github.abel533.echarts.axis.CategoryAxis;
import com.github.abel533.echarts.axis.ValueAxis;
import com.github.abel533.echarts.code.Magic;
import com.github.abel533.echarts.code.Orient;
import com.github.abel533.echarts.code.PointerType;
import com.github.abel533.echarts.code.Tool;
import com.github.abel533.echarts.code.Trigger;
import com.github.abel533.echarts.code.X;
import com.github.abel533.echarts.code.Y;
import com.github.abel533.echarts.feature.MagicType;
import com.github.abel533.echarts.series.Line;
import com.yongqi.mapper.FamilyMapper;
import com.yongqi.mapper.MemberMapper;
import com.yongqi.mapper.console.BillMapper;
import com.yongqi.model.Family;
import com.yongqi.model.Member;
import com.yongqi.model.console.Bill;

@Service
public class IncomeService {
	@Autowired
	BillMapper billMapper;
	@Autowired
	FamilyMapper familyMapper;
	@Autowired
	MemberMapper memberMapper;

	// 收入添加记录方法
	public void incomeAdd(Bill bill) {
		billMapper.insertBill(bill);
	}

	// 收入分页查询方法
	public List<Bill> queryPageItems(Map<String, String> map) {
		List<Bill> billList = billMapper.queryPageItems(map);
		return billList;
	}

	// 收入删除记录方法
	public void deleteIncomeItems(String id) {
		billMapper.deleteItems(id);
	}

	// 收入修改记录方法
	public void incomeUpdate(Bill bill) {
		billMapper.updateBill(bill);
	}

	// 收入各月示意图
	public Option incomeChart() {
		Map<String, String> map = new HashMap<String, String>();
		// 获取当前登录家庭账号
		String familyAccount = ((Family) SecurityUtils.getSubject().getPrincipal()).getFamilyaccount();
		map.put("familyAccount", familyAccount);
		// 根据当前家庭账号获取家庭内成员信息
		List<Member> members = memberMapper.queryMember(map);
		// 获取当前年月，得到自用户注册到当前年月间所有年月区间
		List<String> year_months = billMapper.queryValidYearMonth(map);
		// 创建Option对象
		Option option = new Option();
		// Echarts标题
		option.title(year_months.get(0) + "到" + year_months.get(year_months.size() - 1) + "各月收入");
		// 提示框组件
		option.tooltip(Trigger.axis);
		option.tooltip().axisPointer().type(PointerType.cross);
		// 图例组件展现了不同系列的标记(symbol)，颜色和名字。可以通过点击图例控制哪些系列不显示。
		// legend拼接所有用户
		StringBuffer memberString = new StringBuffer();
		for (Member member : members) {
			memberString.append(member.getMemberName()).append("@");
		}
		memberString.delete(memberString.length() - 1, memberString.length());
		option.legend().orient(Orient.horizontal).x(X.center).y(Y.top).data(memberString);
		// 工具栏。内置有导出图片，数据视图，动态类型切换，数据区域缩放，重置五个工具。
		option.toolbox().feature(Tool.saveAsImage, Tool.mark, // 辅助线开关
				Tool.dataView, // 数据视图工具，可以展现当前图表所用数据，编辑后可以动态更新
				new MagicType(Magic.line, Magic.bar), // 动态类型切换
				Tool.restore);
		option.calculable(true);
		// 类目轴，适用于离散的类目数据，为该类型时必须通过 data 设置类目数据。
		CategoryAxis categoryAxis = new CategoryAxis();
		categoryAxis.type(new CategoryAxis().type().category).boundaryGap(false);
		StringBuffer year_monthString = new StringBuffer();
		// 拼接年月数据
		for (String year_month : year_months) {
			year_monthString.append(year_month).append("@");
		}
		year_monthString.delete(year_monthString.length() - 1, year_monthString.length());
		categoryAxis.data(year_monthString);
		option.xAxis(categoryAxis);
		// 直角坐标系 grid 中的 y 轴，一般情况下单个 grid 组件最多只能放左右两个 y 轴，多于两个 y 轴需要通过配置 offset
		// 属性防止同个位置多个 Y 轴的重叠。
		ValueAxis valueAxis = new ValueAxis();
		valueAxis.type(new ValueAxis().type().value);
		option.yAxis(valueAxis);

		for (Member member : members) {
			map.put("member", member.getMemberName());
			// 先构建单个折线图然后组合
			Line line0 = new Line();
			line0.name(member.getMemberName());
			line0.smooth(true);
			line0.itemStyle().normal().areaStyle().type("default");
			StringBuffer moneyBuffer = new StringBuffer();
			for (String year_month : year_months) {
				map.put("year_month", year_month);
				String money = billMapper.queryIncome(map);
				moneyBuffer.append(money).append("@");
			}
			moneyBuffer.delete(moneyBuffer.length() - 1, moneyBuffer.length());
			line0.data(moneyBuffer);
			option.series(line0);
		}

		return option;

	}
}
